package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.Date;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKIgv;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.ComandoVer;
import pe.com.cotelasa.scp.controlador.comando.IComando;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.entidad.Igv;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBIgv")
@Scope("request")
public class MBIgv extends MBGenerico implements IMantenedor, Serializable {

    private static final long serialVersionUID = -3008828663507135744L;
    private static Logger logger = Logger.getLogger(MBIgv.class);
    @Inject
    private BKIgv bkIgv;
    @Inject
    private IServicioIgv servicioIgv;
    
    @Autowired
    BKSession session;
    

    public MBIgv() {
    }

    public String nuevo() {
        this.bkIgv.setComando(new ComandoGuardar(this));
        bkIgv.setIgvFormulario(new Igv());
        if (bkIgv.getIgvVigente() == null) {
            bkIgv.setFechaMinima(null);
        } else {
            bkIgv.setFechaMinima(UtilitarioFecha.agregarDiasFechaDate(bkIgv.getIgvVigente().getInicioPeriodo(),1));
        }
        bkIgv.setFechaMaxima(null);
        
        return URLPaginacion.Igv.URL_FORMULARIO_IGV;
    }

    public String editar() {
        this.bkIgv.setComando(new ComandoActualizar(this));
        try {
            Igv igvInferior = servicioIgv.conseguirIgvPorId(bkIgv.getIgvFormulario().getId() - 1);
            Igv igvSuperior = servicioIgv.conseguirIgvPorId(bkIgv.getIgvFormulario().getId() + 1);

            if (igvInferior != null) bkIgv.setFechaMinima(UtilitarioFecha.agregarDiasFechaDate(igvInferior.getInicioPeriodo(),1));
            else bkIgv.setFechaMinima(null);
            
            if (igvSuperior != null) bkIgv.setFechaMaxima(UtilitarioFecha.agregarDiasFechaDate(igvSuperior.getInicioPeriodo(),-1));
            else bkIgv.setFechaMaxima(null);
            
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Igv.URL_FORMULARIO_IGV;
    }

    public String ver() {
        //comando = new ComandoVer(this);
        return URLPaginacion.Igv.URL_FORMULARIO_IGV;
    }

    public String guardar() {
        Igv igv = bkIgv.getIgvFormulario();
        igv.setUsrCreacion(session.getUsuario().getUsuario());
        igv.setFecCreacion(new Date());

        try {
            if(bkIgv.getIgvVigente()!=null){
                Igv igvInferior = bkIgv.getIgvVigente();
                igvInferior.setFinPeriodo(igv.getInicioPeriodo());
                servicioIgv.actualizarIgv(igvInferior);
            }
            servicioIgv.guardarIgv(igv);
            bkIgv.setIgvVigente(servicioIgv.ConseguirIgvVigente());
            bkIgv.setListaIgvsActivos(servicioIgv.listarIgvsActivos());
            mostrarMensaje("Se guardo el igv satisfactoriamente.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Igv.URL_LISTA_IGV;
    }

    public String actualizar() {
        Igv igv = bkIgv.getIgvFormulario();
        igv.setUsrModificacion(session.getUsuario().getUsuario());
        igv.setFecModificacion(new Date());

        try {
            Igv igvInferior = servicioIgv.conseguirIgvPorId(igv.getId() - 1);
            if (igvInferior != null) {
                igvInferior.setFinPeriodo(UtilitarioFecha.agregarDiasFechaDate(igv.getInicioPeriodo(),1));
                servicioIgv.actualizarIgv(igvInferior);
            }
            servicioIgv.actualizarIgv(igv);
            bkIgv.setIgvVigente(servicioIgv.ConseguirIgvVigente());
            bkIgv.setListaIgvsActivos(servicioIgv.listarIgvsActivos());
            mostrarMensaje("Se actualizo los datos del igv satisfactoriamente.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Igv.URL_LISTA_IGV;
    }

    public String mostrarMantenimiento() {

        try {
            bkIgv.setListaIgvsActivos(servicioIgv.listarIgvsActivos());
            bkIgv.setIgvVigente(servicioIgv.ConseguirIgvVigente());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Igv.URL_LISTA_IGV;
    }

    public void eliminar(ActionEvent actionEvent) {
        Igv igv = bkIgv.getIgvSeleccionado();
        igv.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        igv.setUsrModificacion(session.getUsuario().getUsuario());
        igv.setFecModificacion(new Date());
        try {
            servicioIgv.actualizarIgv(igv);
            mostrarMensaje("Se elimino el igv satisfactoriamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String aceptar() {
        try {
            servicioIgv.actualizarIgv(bkIgv.getIgvFormulario());
            bkIgv.setIgvFormulario(servicioIgv.conseguirIgvPorId(1));
            bkIgv.setListaIgvsActivos(servicioIgv.listarIgvsActivos());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Igv.URL_LISTA_IGV;
    }


    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return mostrarMantenimiento();
    }
}
